package com.kim.useroauth.server.service;

import com.kim.common.utilcom.model.Result;
import com.kim.useroauth.common.dto.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 用户认证Service
 */
public interface IUserOauthService {

    /**
     * 密码模式
     * 用户名/手机号 密码 （图片验证码） 登录
     *
     * @param username         用户名/手机号
     * @param password         密码
     * @param verificationCode 图片验证码
     * @param key              验证码唯一键
     * @param authType         扩展授权类型
     * @param clientId         客户端ID
     * @param clientSecret     客户端密钥
     * @param scope            应用授权作用域
     */
    Result<Object> loginByUsernameAndPassword(String username,
                                              String password,
                                              String verificationCode,
                                              String key,
                                              String authType,
                                              String clientId,
                                              String clientSecret,
                                              String scope);

    /**
     * 获取授权码
     *
     * @param response                   响应体
     * @param reqGetAuthorizationCodeDto 获取授权码 DTO
     * @throws IOException io异常
     */
    void getAuthorizationCode(HttpServletResponse response, ReqGetAuthorizationCodeDTO reqGetAuthorizationCodeDto) throws IOException;

    /**
     * 授权码获取token
     *
     * @param reqGetTokenByAuthorizationCodeDto 授权码获取token DTO
     * @return org.surge.oauth2common.model.Result
     */
    Result getTokenByAuthorizationCode(ReqGetTokenByAuthorizationCodeDTO reqGetTokenByAuthorizationCodeDto);

    /**
     * 刷新token
     * reqRefreshTokenDTO 刷新tokenDTO
     *
     * @return org.surge.oauth2common.model.Result
     */
    Result refreshToken(ReqRefreshTokenDTO reqRefreshTokenDTO);

    /**
     * 手机号 + 验证码登录
     *
     * @param reqPhoneLoginDTO 手机号验证码登录DTO
     */
    Result loginByPhone(ReqPhoneLoginDTO reqPhoneLoginDTO);

    /**
     * 用户注册
     *
     * @param phoneCode   短信验证码
     * @param phoneNumber 手机号
     * @param password    密码
     * @param shareCode   分享码
     */
    Result userRegister(String phoneCode, String phoneNumber, String password, String shareCode);

    /**
     * 注册成功直接颁发令牌
     *
     * @param phoneNumber  用户手机号
     * @param clientId     客户端ID
     * @param clientSecret 客户端密钥
     * @param scope        授权作用域
     */
    Result getTokenByUserRegister(String phoneNumber, String clientId, String clientSecret, String scope);

    /**
     * 微信授权登录
     *
     * @param reqWeChatLoginDTO 微信授权登录DTO
     */
    Result loginByWeChat(ReqWeChatLoginDTO reqWeChatLoginDTO);

    /**
     * 凭证模式授权登陆
     * @param reqGetTokenByCredentialsDTO
     * @return
     */
    Result getTokenByCredentials(ReqGetTokenByCredentialsDTO reqGetTokenByCredentialsDTO);

}
